package com.mine.yyb.common.utils.date;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import org.apache.commons.lang3.time.DateFormatUtils;

import com.mine.yyb.modules.sys.bo.OrderBO;

/**
 * 
 * <p>
 * <一句话功能简述> 日期工具类, 继承org.apache.commons.lang.time.DateUtils类 <功能详细描述>
 * </p>
 *
 * @author 姓名 石彩宝
 * @version [版本号, 2015年10月28日]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public class MineDateUtils extends org.apache.commons.lang3.time.DateUtils
{
    
    private static String[] parsePatterns =
        {"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss",
            "yyyy/MM/dd HH:mm", "yyyy/MM", "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
            
    /**
     * 
     * <p>
     * <一句话功能简述> 得到当前日期字符串 格式（yyyy-MM-dd） <功能详细描述>
     * </p>
     * 
     * @author 石彩宝
     * @版本号 [2015年10月28日 下午3:02:58]
     * @return
     * @see [类、类#方法、类#成员]
     */
    public static String getDate()
    {
        return getDate("yyyy-MM-dd");
    }
    
    /**
     * 
     * <p>
     * <一句话功能简述> 得到当前日期字符串 格式（yyyy-MM-dd） pattern可以为："yyyy-MM-dd" "HH:mm:ss" "E" <功能详细描述>
     * </p>
     * 
     * @author 石彩宝
     * @版本号 [2015年10月28日 下午3:03:24]
     * @param pattern
     * @return
     * @see [类、类#方法、类#成员]
     */
    public static String getDate(String pattern)
    {
        return DateFormatUtils.format(new Date(), pattern);
    }
    
    /**
     * 
     * <p>
     * <一句话功能简述> 得到日期字符串 默认格式（yyyy-MM-dd） pattern可以为："yyyy-MM-dd" "HH:mm:ss" "E" <功能详细描述>
     * </p>
     * 
     * @author 石彩宝
     * @版本号 [2015年10月28日 下午3:24:45]
     * @param date
     * @param pattern
     * @return
     * @see [类、类#方法、类#成员]
     */
    public static String formatDate(Date date, Object... pattern)
    {
        String formatDate = null;
        if (pattern != null && pattern.length > 0)
        {
            formatDate = DateFormatUtils.format(date, pattern[0].toString());
        }
        else
        {
            formatDate = DateFormatUtils.format(date, "yyyy-MM-dd");
        }
        return formatDate;
    }
    
    /**
     * 
     * <p>
     * <一句话功能简述> 得到日期时间字符串，转换格式（yyyy-MM-dd HH:mm:ss） <功能详细描述>
     * </p>
     * 
     * @author 石彩宝
     * @版本号 [2015年10月28日 下午3:25:02]
     * @param date
     * @return 返回转换格式后的时间格式
     * @see [类、类#方法、类#成员]
     */
    public static String formatDateTime(Date date)
    {
        return formatDate(date, "yyyy-MM-dd HH:mm:ss");
    }
    
    /**
     * 
     * <p>
     * <一句话功能简述> 得到当前时间字符串 格式（HH:mm:ss） <功能详细描述>
     * </p>
     * 
     * @author 石彩宝
     * @版本号 [2015年10月28日 下午3:25:19]
     * @return
     * @see [类、类#方法、类#成员]
     */
    public static String getTime()
    {
        return formatDate(new Date(), "HH:mm:ss");
    }
    
    /**
     * 
     * <p>
     * <一句话功能简述> 得到当前日期和时间字符串 格式（yyyy-MM-dd HH:mm:ss） <功能详细描述>
     * </p>
     * 
     * @author 石彩宝
     * @版本号 [2015年10月28日 下午3:25:42]
     * @return
     * @see [类、类#方法、类#成员]
     */
    public static String getDateTime()
    {
        return formatDate(new Date(), "yyyy-MM-dd HH:mm:ss");
    }
    
    /**
     * 
     * <p>
     * <一句话功能简述> 得到当前年份字符串 格式（yyyy） <功能详细描述>
     * </p>
     * 
     * @author 石彩宝
     * @版本号 [2015年10月28日 下午3:26:03]
     * @return
     * @see [类、类#方法、类#成员]
     */
    public static String getYear()
    {
        return formatDate(new Date(), "yyyy");
    }
    
    /**
     * 
     * <p>
     * <一句话功能简述> 得到当前月份字符串 格式（MM） <功能详细描述>
     * </p>
     * 
     * @author 石彩宝
     * @版本号 [2015年10月28日 下午3:26:18]
     * @return
     * @see [类、类#方法、类#成员]
     */
    public static String getMonth()
    {
        return formatDate(new Date(), "MM");
    }
    
    /**
     * 
     * <p>
     * <一句话功能简述> 得到当天字符串 格式（dd） <功能详细描述>
     * </p>
     * 
     * @author 石彩宝
     * @版本号 [2015年10月28日 下午3:26:30]
     * @return
     * @see [类、类#方法、类#成员]
     */
    public static String getDay()
    {
        return formatDate(new Date(), "dd");
    }
    
    /**
     * 
     * <p>
     * <一句话功能简述> 得到当前星期字符串 格式（E）星期几 <功能详细描述>
     * </p>
     * 
     * @author 石彩宝
     * @版本号 [2015年10月28日 下午3:26:44]
     * @return
     * @see [类、类#方法、类#成员]
     */
    public static String getWeek()
    {
        return formatDate(new Date(), "E");
    }
    
    /**
     * 
     * <p>
     * <一句话功能简述> 日期型字符串转化为日期 格式 { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy/MM/dd",
     * "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm" } <功能详细描述>
     * </p>
     * 
     * @author 石彩宝
     * @版本号 [2015年10月28日 下午3:27:04]
     * @param str
     * @return
     * @see [类、类#方法、类#成员]
     */
    public static Date parseDate(Object str)
    {
        if (str == null)
        {
            return null;
        }
        try
        {
            return parseDate(str.toString(), parsePatterns);
        }
        catch (ParseException e)
        {
            return null;
        }
    }
    
    /**
     * 
     * <p>
     * <一句话功能简述> 获取过去的天数 <功能详细描述>
     * </p>
     * 
     * @author 石彩宝
     * @版本号 [2015年10月28日 下午3:27:21]
     * @param date
     * @return
     * @see [类、类#方法、类#成员]
     */
    public static long pastDays(Date date)
    {
        long t = new Date().getTime() - date.getTime();
        return t / (24 * 60 * 60 * 1000);
    }
    
    /**
     * 
     * <p>
     * <一句话功能简述> 获取过去的小时 <功能详细描述>
     * </p>
     * 
     * @author 石彩宝
     * @版本号 [2015年10月28日 下午3:27:46]
     * @param date
     * @return
     * @see [类、类#方法、类#成员]
     */
    public static long pastHour(Date date)
    {
        long t = new Date().getTime() - date.getTime();
        return t / (60 * 60 * 1000);
    }
    
    /**
     * 
     * <p>
     * <一句话功能简述> 获取过去的分钟 <功能详细描述>
     * </p>
     * 
     * @author 石彩宝
     * @版本号 [2015年10月28日 下午3:27:57]
     * @param date
     * @return
     * @see [类、类#方法、类#成员]
     */
    public static long pastMinutes(Date date)
    {
        long t = new Date().getTime() - date.getTime();
        return t / (60 * 1000);
    }
    
    /**
     * 
     * <p>
     * <一句话功能简述> 转换为时间（天,时:分:秒.毫秒） <功能详细描述>
     * </p>
     * 
     * @author 石彩宝
     * @版本号 [2015年10月28日 下午3:28:08]
     * @param timeMillis
     * @return
     * @see [类、类#方法、类#成员]
     */
    public static String formatDateTime(long timeMillis)
    {
        long day = timeMillis / (24 * 60 * 60 * 1000);
        long hour = (timeMillis / (60 * 60 * 1000) - day * 24);
        long min = ((timeMillis / (60 * 1000)) - day * 24 * 60 - hour * 60);
        long s = (timeMillis / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
        long sss = (timeMillis - day * 24 * 60 * 60 * 1000 - hour * 60 * 60 * 1000 - min * 60 * 1000 - s * 1000);
        return (day > 0 ? day + "," : "") + hour + ":" + min + ":" + s + "." + sss;
    }
    
    /**
     * 
     * <p>
     * <一句话功能简述> 获取两个日期之间的天数 <功能详细描述>
     * </p>
     * 
     * @author 石彩宝
     * @版本号 [2015年10月28日 下午3:28:27]
     * @param before
     * @param after
     * @return
     * @see [类、类#方法、类#成员]
     */
    public static double getDaySpace(Date before, Date after)
    {
        long beforeTime = before.getTime();
        long afterTime = after.getTime();
        return (afterTime - beforeTime) / (1000 * 60 * 60 * 24);
    }
    
    
    public static void main(String[] args) throws ParseException
    {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date createDate = sdf.parse("2016-03-12");
        Calendar createDateCalendar = Calendar.getInstance();
        createDateCalendar.setTime(createDate);
        
        Date orderDate = sdf.parse("2017-03-12");
        Calendar orderDateCalendar = Calendar.getInstance();
        orderDateCalendar.setTime(orderDate);
        
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR, createDateCalendar.get(Calendar.YEAR));// 年
        calendar.set(Calendar.MONTH, createDateCalendar.get(Calendar.MONTH));// 月
        calendar.set(Calendar.DAY_OF_MONTH, createDateCalendar.get(Calendar.DAY_OF_MONTH));// 日
        
        calendar.add(Calendar.MONTH, OrderBO.PARENT_REBATE_MONTH);// 加一年
        calendar.add(Calendar.DAY_OF_MONTH, -1);// 减一天
        
        
        if(orderDateCalendar.before(calendar))
        {
            System.out.println("未过期");
        }
        else
        {
            System.out.println("已过期");
        }
    }
    
    /**
     * 
     * <pre>
     * <一句话功能简述>
     * 将日期转为13位时间戳
     * <功能详细描述>
     * </pre>
     * 
     * @author 石彩宝
     * @版本号 [2015年9月16日 上午8:49:18]
     * @param date (yyyy-MM-dd HH:mm:ss)
     * @return 返回时间戳
     * @throws ParseException
     * @see [类、类#方法、类#成员]
     */
    public static long dateToMillionSeconds(String date)
        throws ParseException
    {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        long millionSeconds = sdf.parse(date).getTime();
        return millionSeconds;
    }
    
    /**
     * 
     * <pre>
     * <一句话功能简述>
     * 将时间戳转为时间
     * <功能详细描述>
     * </pre>
     * 
     * @author 石彩宝
     * @版本号 [2015年9月21日 上午11:19:12]
     * @param millionSeconds
     * @return
     * @throws ParseException
     * @see [类、类#方法、类#成员]
     */
    public static String millionSecondsToDate(String millionSeconds)
    {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String date = sdf.format(new Date(Long.parseLong(millionSeconds)));
        return date;
    }
    
}
